# -*- coding:utf-8 -*-
import json
import logging
import os
import warnings
import re

from langchain import FAISS, OpenAI

# @Time    : 2023/5/31 16:57
# @Author  : liyou
# @Email   : liyou@lingxi.ai
# @File    : loan_user_scenarios.py
# @Software: LLM_internal
# 用户信息抽取

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
warnings.filterwarnings("ignore")
logging.basicConfig(format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s',
                    level=logging.INFO)
os.environ["OPENAI_API_KEY"] = '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'

class UserInfoCollector():
    def __init__(self):
        super().__init__()
        self.llm = OpenAI(temperature=0, model_name="gpt-3.5-turbo-16k")
        self.system_config = (
            """
        我想让你作为一个信贷产品销售坐席，你需要从电话沟通记录中提取到我想要的信息点，返回给我一个python字典对象。
        '####'中间是是沟通记录。
        你提取到的信息点包括 [用户用款方案,用户用款方案的总额度,用户用款场景,用户用款场景需要总额度,是否有资金缺口,资金缺口金额,用户工作]并逐步解释提取逻辑。 
        你在提取信息的时候，不要无中生有，如果用户没有明说，不要自己根据示例乱说，一定要是沟通记录中表述出来的。
        你在提取信息的时候，一定要参考示例中'//'后的逻辑，并且根据已知信息逐步推理，并且遵循下面逻辑:
        - `用户用款方案`是指用户拥有的用款方案,你需要在下面列表中选择多个:[银行贷款,网贷平台,自有资金,找亲戚或者朋友借款,信用卡,无]，而且需要分多步处理
            - 第一步:如果坐席询问用户是否用过借呗，微粒贷，信用卡这些网贷平台，根据用户的回答进行提取'用户用款方案'是否包含'网贷平台'、'信用卡'，
            - 第二步:如果坐席询问用户是否用过银行的贷款，根据用户的回答进行提取'用户用款方案'是否包含'银行贷款'，
            - 第三步:如果坐席询问用户如何应对资金周转,根据用户回答提取'用户用款方案'是否有'自有资金'、'找亲戚或者朋友借款'
            - 第四步:将前三步提取的结果作为集合，作为最终结果
        -  `用户用款方案的总额度` 是指用户用款方案的额度，如果是多个方案，需要将对应多个额度累加
        -  `用户用款场景`从下面选择[生意周转,日常消费,无]，如果没有明确表示需要根据工作推理,上班的话场景就是日常消费,做生意的话就是生意周转。
        -  `用户用款场景需要总额度`是指用户为了满足生意周转和日常消费的资金额度。
        -  `是否有资金缺口`直接返回无
        -  `资金缺口金额`直接返回无
        -  `用户工作`包括[上班,做生意,无业,未知]
        你要注意：
        1.如果用户表达会使用自己的储蓄进行资金周转,那么`用户用款方案`就需要有'自有资金'。
        2.返回的格式保持为python字典类型, [用户用款方案的总额度,用户用款场景需要总额度,是否有资金缺口]提取的结果要是阿拉伯数字，不可以是中文数字。
        下面是示例:
        
        示例1:
       「 `坐席:您拒绝是因为您现在手上有其他的借款平台在使用吗？借呗，微粒贷，信用卡这些会用吗？ //第一步尝试确认用户是否用过网贷平台、信用卡
        用户:借呗。 // 第一步从'借呗'可以提取到`用户用款方案`包含'网贷平台' ,同理'借呗','花呗','微粒贷','微众银行','平安普惠'都是网贷平台`
        `坐席:没有用过的话，银行的贷款有用过吗？// 第二步尝试确认'用户用款方案'是否包含'银行贷款'
        用户:没用过。// 第二步从'没有用过'可以确认`用户用款方案`不包含'银行贷款'，同理如果用户回答'有'或者'用过'等肯定，则代表'用户用款方案'不能包含'银行贷款'。`
        `坐席:那您后面如果有一些临时性的比较大额资金周转需求的时候是怎么办呀？是找亲戚朋友去周转还是用自己的储蓄？。 //第三步询问用户如何应对资金周转
        用户:自己的储蓄。// 第三步 从自己储蓄可以提取到`用户用款方案`包含'自有资金' `。
        」输出模板：{"用户用款方案": ["网贷平台","自有资金"], "用户用款方案的总额度": 0, "用户用款场景": "", "用户用款场景需要总额度": "无", "是否有资金缺口": "无", "资金缺口金额": 0, "用户工作": ""}
        
        示例2:
        「`坐席:您拒绝是因为您现在手上有其他的借款平台在使用吗？借呗，微粒贷，信用卡这些会用吗？
        用户:信用卡。 // 第一步从'信用卡'可以提取到`用户用款方案`包含'信用卡'
        `坐席:没有用过的话，银行的贷款有用过吗？
        用户:用过。// 第二步从'用过'可以确认`用户用款方案`包含'银行贷款'
        `坐席:那您后面如果有一些临时性的比较大额资金周转需求的时候是怎么办呀？是找亲戚朋友去周转还是用自己的储蓄？。
        用户:自己的储蓄。// 第三步 从自己储蓄可以提取到`用户用款方案`包含'自有资金' `。
        」
        输出模板：{"用户用款方案": ["信用卡","银行贷款","自有资金"], "用户用款方案的总额度": 0, "用户用款场景": "", "用户用款场景需要总额度": "无", "是否有资金缺口": "无", "资金缺口金额": 0, "用户工作": ""}

        示例3「
        坐席:这些产品给您多少额度?
        用户:十五万
        坐席:您资金周转需要多少额度？
        用户:二十万
        」则能提取出 `用户用款方案的总额度`是150000,`资金缺口金额`是50000。
        一定要确保返回的结果是个python字典对象。
            """
        )

    def query(self, conversation, history_userinfo_jsonstr: str = None):
        if history_userinfo_jsonstr is None:
            history_user_info_dic_int = {
                '用户用款方案': ['',''],
                '用户用款方案的总额度': 0,
                '用户用款场景': '无',
                '用户用款场景需要总额度': '无',
                '是否有资金缺口': '无',
                '资金缺口金额': 0
            }
            history_userinfo_jsonstr = json.dumps(history_user_info_dic_int, ensure_ascii=False)
        chat_context = ''
        for message in conversation:
            chat_context += '坐席:' if message['role'] == 'assistant' else '用户:'
            chat_context += message['content'] + '。\n'

        if chat_context is not None:
            lines = chat_context.split('\n')
            if len(lines) >= 50:
                chat_context = lines[-50:]  # 截取部分最后n条记录

        chat_context1 = re.sub(r":.*?@", ":", chat_context)
        logging.info(f'信贷-信收-上下文:{chat_context1}')
        # final_prompt = self.system_config + "\n####" + '.'.join(chat_context1) + "####\n"+ "\n====" + history_userinfo_jsonstr + "====\n"
        final_prompt = self.system_config + "\n####" + ''.join(chat_context1) + "####\n"
        logging.info(f'信贷-信收-final_prompt:{final_prompt}')
        user_info = self.llm(final_prompt)

        user_info_dic = user_info
        logging.info(f'信贷-信收-结果:{user_info_dic}')


        # logging.info(f'大模型返回的内容:{user_info}')
        if user_info.startswith('无'):
            return ''
        else:
            response = ''
            user_info_dic = eval(user_info_dic)
            try:
                user_need_total = int(user_info_dic['用户用款场景需要总额度'])
            except ValueError:
                user_info_dic['用户用款场景需要总额度'] = 0
                try:
                    user_need_total = int(user_info_dic['用户用款方案的总额度'])
                except ValueError:
                    user_info_dic['用户用款方案的总额度'] = 0

            if int(user_info_dic['用户用款场景需要总额度']) > int(user_info_dic['用户用款方案的总额度']):
                user_info_dic['资金缺口金额'] = int(user_info_dic['用户用款场景需要总额度']) -int( user_info_dic['用户用款方案的总额度'])
                user_info_dic['是否有资金缺口'] = '是'
            else:
                user_info_dic['是否有资金缺口'] = '否'
            return user_info_dic


if __name__ == '__main__':
    UserInfoCollector_query = UserInfoCollector()
    sessions = \
        [{'role': 'assistant', 'content': 'HB35-1C@喂，您好，不好意思打扰了，请问您是机主本人么？'},
         {'role': 'user', 'content': '是的。'},
         {'role': 'assistant', 'content': 'HB01-B-1C@诶，您好～我是360借条的官方客服，工号95288，来电是平台活动，给您开通了快速申请通道，2步即可评估额度，一旦审核通过，需要时直接用，不用不花钱，还有免息活动，1-2分钟和您说下好吧？'},
         {'role': 'user', 'content': '我不需要。'},
         {'role': 'assistant', 'content': 'HB35-1C@您拒绝是因为您现在手上有其他的借款平台在使用吗？比如借呗，微粒贷，信用卡？'},
         {'role': 'user', 'content': '用过信用卡'},
         {'role': 'assistant', 'content': 'F01@网贷平台有用过的话，银行的贷款有用过吗？'},
         {'role': 'user', 'content': '用过'},
         {'role': 'assistant', 'content': 'F01@那您后面如果有一些临时性的比较大额资金周转需求的时候是怎么办呀？是找亲戚朋友去周转还是用自己的储蓄？'},
         {'role': 'user', 'content': '没有资金周转需求。'},
         {'role': 'assistant', 'content': 'F01@那您是上班还是自己做一些生意啊？'},
         {'role': 'user', 'content': '上班。'},
         {'role': 'assistant', 'content': '上面的产品给您多少额度。'},
         {'role': 'user', 'content': '五万。'},
         {'role': 'assistant', 'content': '您平时日常消费需要多少资金周转。'},
         {'role': 'user', 'content': '三万。'},
         ]
    user_info_dic = UserInfoCollector_query.query(sessions)
